今天想要分享 Laravel 比較進階的寫法,這不是在官方文件中看到的,所以可能只是大多數人推薦的開發方式,可以當作參考就好。因為怕一下子講太深,前面會先簡單帶過基礎名詞。
以我自己的理解來說,pattern 就是一種開發的習慣 / 偏好,它在大部分時候都是可選的,端看遇到的情境適不適用?它不是最優解,通常是權衡之下的一種選擇。
有開發過專案大概都經歷過這個階段,一個 controller 從一百多行默默成長到一千多百行。閱讀開始有負擔,這時候就可以開始把跟這個 controller 比較沒有關係的部分拆出去。因為路由的設計,通常會是一個名稱分配一個 controller,那些拆分出去的小功能就很適合丟到 app/Services 裡面。
請看以下範例 (來源):
app\Services\EmailService.php
<?php
namespace App\Services;
use Illuminate\Mail\Message;
use Mail;
/**
* Class EmailService
*
* @package \App\Services
*/
/**
* Class EmailService
*
* @package App\Services
*/
class EmailService
{
/**
* @var \Mail
*/
protected $mailer;
/**
* 将相依的 Mailer 注入到 EmailService
* EmailService constructor.
*
* @param $mailer
*/
public function __construct(Mail $mailer)
{
$this->mailer = $mailer;
}
/**
* 发送 Email的逻辑写在 send() 不是使用 Mail Facade,而是使用 $this->mailer
* @param array $request
*/
public function send(array $request)
{
$this->mailer->queue('email.index',$request,function(Message $message){
$message->sender(env('MAIL_USERNAME'));
$message->subject(env('MAIL_SUBJECT'));
$message->to(env('MAIL_TO_ADDR'));
});
}
}
app\Controllers\UserController.php
<?php
namespace App\Http\Controllers;
use App\Services\EmailService;
use Illuminate\Http\Request;
/**
* Class UserController
*
* @package App\Http\Controllers
*/
class UserController extends Controller
{
/**
* @var \App\Services\EmailService
*/
protected $emailService;
/**
* @param \Illuminate\Http\Request $request
*/
public function store(Request $request)
{
$this->emailService->send($request->all());
}
}
剛開始聽到 service 的時候還真的會跟 Service Provider 搞混在一起,但其實這兩個東西運作的方式是不一樣的,只是剛剛好都有 service 這個單字出現而已。Service Provider 提供的服務跟 Laravel 的核心運作有比較大的關係。看官方文件介紹 Service Provider 會發現它需要在 config/app.php
先定義,然後還要處理 boot() 和 regist() 的部分,跟上面的範例就差非常多。所以不要把 service 跟 Service Provider 搞混囉
以上,今天介紹一點 Laravel 的進階寫法,謝謝縮看